package org.beetl.sql.core.mapper;

import java.util.List;

import org.beetl.sql.core.db.KeyHolder;
import org.beetl.sql.core.engine.PageQuery;
import org.beetl.sql.core.mapper.internal.AllAmi;
import org.beetl.sql.core.mapper.internal.AllCountAmi;
import org.beetl.sql.core.mapper.internal.InsertAmi;
import org.beetl.sql.core.mapper.internal.InsertBatchAmi;
import org.beetl.sql.core.mapper.internal.InsertReturnKeyAmi;
import org.beetl.sql.core.mapper.internal.InsertTemplateAmi;
import org.beetl.sql.core.mapper.internal.TemplateAmi;
import org.beetl.sql.core.mapper.internal.TemplatePageAmi;
import org.beetl.sql.mapper.annotation.AutoMapper;

/**
 * BaseMapper.
 *
 * @param <T> the generic type
 */
public interface BaseMapper<T> extends org.beetl.sql.mapper.BaseMapper<T>{

    /**
     * （数据库表有自增主键调用此方法）如果实体对应的有自增主键，插入一个实体到数据库，设置assignKey为true的时候，将会获取此主键
     *
     * @param entity
     * @param autDbAssignKey 是否获取自增主键
     */
	@AutoMapper(InsertAmi.class)
    void insert(T entity, boolean autDbAssignKey);

    /**
     * 如果实体对应的有自增主键，插入实体到数据库，对于null值不做处理,设置assignKey为true的时候，将会获取此主键
     *
     * @param entity
     * @param autoDbAssignKey
     */
	@AutoMapper(InsertTemplateAmi.class)
    void insertTemplate(T entity, boolean autoDbAssignKey);

    /**
     * 批量插入，设置assignKey为true的时候，数据库将会返回自增主键
     * @param list
     * @param autoDbAssignKey
     */
	@AutoMapper(InsertBatchAmi.class)
    void insertBatch(List<T> list,boolean  autoDbAssignKey);

    /**
     * （数据库表有自增主键调用此方法）如果实体对应的有自增主键，插入实体到数据库，自增主键值放到keyHolder里处理
     *
     * @param entity
     * @return
     */
	@AutoMapper(InsertReturnKeyAmi.class)
    KeyHolder insertReturnKey(T entity);

    /**
     * 返回实体对应的一个范围的记录
     *
     * @param start
     * @param size
     * @return
     */
	@AutoMapper(AllAmi.class)
    List<T> all(int start, int size);

    /**
     * 返回实体在数据库里的总数
     *
     * @return
     */
	@AutoMapper(AllCountAmi.class)
    long allCount();

	@AutoMapper(TemplateAmi.class)
    List<T> template(T entity, int start, int size);

	@AutoMapper(TemplatePageAmi.class)
    void templatePage(PageQuery<T> query);

}
